package com.thekernel.youdaoyun.service;

import com.thekernel.youdaoyun.bean.Note;
import com.thekernel.youdaoyun.exception.MyException;
import com.thekernel.youdaoyun.exception.impl.UserNotLoginException;
import org.springframework.stereotype.Repository;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * @Author TheKernel
 * @Date 2019/9/14 11:50 上午
 * @Version 1.0
 * @Description
 */
@Repository
public interface NoteService {

    /**
     * 添加笔记
     *
     * @param note 笔记信息(note_title, note_content, note_user)
     * @return -1: Data Not Found 0: Note Already Exists 1: Success
     */
    int addNote(Note note, String content) throws MyException;

    /**
     * 查看有效的笔记
     *
     * @param userId 用户id
     * @return 有效的笔记列表
     */
    Note[] queryValidNotes(Long userId);

    /**
     * 查看已进入回收站的笔记
     *
     * @param userId 用户id
     * @return 回收站的笔记列表
     */
    Note[] queryDeletedNotes(Long userId);

    /**
     * 移动笔记到回收站
     *
     * @param noteId 笔记 id
     * @return 1: 删除成功 0: 删除失败
     * @throws MyException 非本人操作等
     */
    int deleteNote(int noteId) throws MyException;

    /**
     * 恢复移动到回收站的笔记
     *
     * @param noteId 笔记 id
     * @return 1: 恢复成功 0: 恢复失败
     * @throws MyException 非本人操作等
     */
    int recoverDeletedNote(long noteId) throws MyException;

    /**
     * 删除回收站中的笔记
     *
     * @param noteId 笔记id
     * @return 1: 删除成功 0: 删除失败
     * @throws MyException 非本人操作等
     */
    int deleteDeletedNote(long noteId) throws MyException;

    /**
     * 根据Note id 查询 Note
     *
     * @param noteId 笔记 id
     * @return 笔记
     * @throws MyException 非本人操作等
     */
    String queryNote(long noteId) throws MyException;

    /**
     * 更新笔记(笔记密码等)
     *
     * @param note 笔记信息
     * @return 1: 更新成功 0: 笔记不存在
     * @throws MyException 非本人操作等
     */
    int updateNote(Note note) throws MyException;

    /**
     * 重命名笔记
     *
     * @param note 新的 note_title 以及 note_id
     * @return 1: 更新成功 0: 更新失败
     * @throws MyException 非本人操作等
     */
    int renameNote(Note note) throws MyException;

    /**
     * 更新笔记内容
     *
     * @param note    笔记
     * @param content 新笔记内容
     * @throws MyException 系统内部错误
     */
    void updateNoteContent(Note note, String content) throws MyException;

    /**
     * 添加文件夹
     *
     * @param note 文件夹信息
     * @return 文件夹 id
     */
    int addFolder(Note note) throws UserNotLoginException;

    /**
     * 全部恢复
     *
     * @return 1: 恢复成功 0: 恢复失败
     */
    int recoverAllDeleted() throws UserNotLoginException;

    /**
     * 清空回收站
     *
     * @return 1: 清空成功 0: 清空失败
     */
    int deletedAllDeleted() throws UserNotLoginException;

    /**
     * 根据关键字搜索笔记
     *
     * @param keyword 关键字
     * @return 笔记 / 未查找到
     */
    Note[] searchNoteByKeyword(String keyword) throws UserNotLoginException;

    /**
     * 根据 noteId 查询笔记
     *
     * @param noteId 笔记id
     * @return note
     */
    Note queryNoteById(int noteId);

    /**
     * 根据文件夹查找文件
     *
     * @param pid 文件夹id
     * @return 文件夹下的文件
     */
    Note[] queryNoteByPid(int pid) throws UserNotLoginException;

    /**
     * 根据笔记设置对应的排序
     *
     * @param noteId 笔记id
     */
    void addZ(int noteId);

    /**
     * 从word中读取数据
     *
     * @param file word 文件
     * @return word文件内容
     */
    String importFromWord(File file) throws UserNotLoginException, IOException, ParserConfigurationException, TransformerException;

}
